
import static org.junit.Assert.*;
import miniBanco.Core.Cliente;

import miniBanco.Core.Cuenta;
import miniBanco.Core.Moneda;
import miniBanco.Core.TipoCuenta;
import miniBanco.Exceptions.HandledException;

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
public class ClienteTestClass {
	
	@Rule
	public ExpectedException expectedEx = ExpectedException.none();
	
	@Test
	public void AgregarCuentaTest()
	{
		Cliente cliente = new Cliente(1);
		Cuenta cuenta = new Cuenta(cliente,Moneda.Pesos,1,TipoCuenta.CajaAhorro);		
		cliente.AgregarCuenta(cuenta);
		assertEquals("failure - strings are not equal", cliente.getCuentas().size(), 1);		
	}
	@Test
	public void AgregarCuentaTestFailureCuentaYaExiste()
	{
		expectedEx.expect(HandledException.class);
		expectedEx.expectMessage("Cuenta ya existe");
		
		Cliente cliente = new Cliente(1);
		Cuenta cuenta = new Cuenta(cliente,Moneda.Pesos,1,TipoCuenta.CajaAhorro);		
		cliente.AgregarCuenta(cuenta);
		cliente.AgregarCuenta(cuenta);	

	}
	@Test(expected = HandledException.class) 
	public void AgregarCuentaTestFailureCuentaNula()
	{
		Cliente cliente = new Cliente(1);		
		cliente.AgregarCuenta(null);
	}
	@Test
	public void HacerDepositoCuentaTestFailureImporteErroneos()
	{
		Cliente cliente = new Cliente(1);


		Cuenta cuenta = new Cuenta(cliente,Moneda.Pesos,1,TipoCuenta.CajaAhorro);		
		cliente.AgregarCuenta(cuenta);
		cliente.getCuentas().get(0).Depositar(100);
		cliente.getCuentas().get(0).Depositar(300);
		assertNotEquals(800, cliente.getCuentas().get(0).getSaldo(),0);		
	}
	@Test
	public void HacerDepositoCuentaTest()
	{
		Cliente cliente = new Cliente(1);

		Cuenta cuenta = new Cuenta(cliente,Moneda.Pesos,1,TipoCuenta.CajaAhorro);		
		cliente.AgregarCuenta(cuenta);
		cliente.getCuentas().get(0).Depositar(100);
		cliente.getCuentas().get(0).Depositar(300);
		assertEquals(400, cliente.getCuentas().get(0).getSaldo(),0);		
	}
	@Test
	public void ExtraerDineroCuentaTest()
	{
		Cliente cliente = new Cliente(1);
		Cuenta cuenta = new Cuenta(cliente,Moneda.Pesos,1,TipoCuenta.CajaAhorro);		
		cliente.AgregarCuenta(cuenta);
		cliente.getCuentas().get(0).Depositar(100);
		cliente.getCuentas().get(0).Depositar(300);

		cliente.getCuentas().get(0).Extraer(100);
		assertEquals(300, cliente.getCuentas().get(0).getSaldo(),0);
	}

	@Test
	public void ExtraerDineroCuentaTestFailureCuentaSinSaldo()
	{
		expectedEx.expect(HandledException.class);
		expectedEx.expectMessage("El saldo de la cuenta es menor al importe");
		
		Cliente cliente = new Cliente(1);
		Cuenta cuenta = new Cuenta(cliente,Moneda.Pesos,1,TipoCuenta.CajaAhorro);		
		cliente.AgregarCuenta(cuenta);
		cliente.getCuentas().get(0).Depositar(100);
		cliente.getCuentas().get(0).Depositar(300);	
		cliente.getCuentas().get(0).Extraer(30000);
	}

	@Test
	public void TransferirDineroCuentaTest()
	{
		
		Cliente cliente = new Cliente(1);
		Cliente cliente2 = new Cliente(2);
		
		Cuenta cuenta = new Cuenta(Moneda.Pesos,1,TipoCuenta.CajaAhorro);	
		cuenta.setID(12);
		Cuenta cuentaDestino = new Cuenta(Moneda.Pesos,1,TipoCuenta.CajaAhorro);	
		cuentaDestino.setID(1);
		
		cliente.AgregarCuenta(cuenta);
		cliente2.AgregarCuenta(cuentaDestino);

		cliente.getCuentas().get(0).Depositar(100);
		cliente.getCuentas().get(0).Depositar(300);	
		cliente.getCuentas().get(0).TransferirDinero(cuentaDestino, 100);
		
		assertEquals(300, cliente.getCuentas().get(0).getSaldo(),0);
		assertEquals(100, cliente2.getCuentas().get(0).getSaldo(),0);
	}
	
	@Test
	public void TransferirDineroCuentaTestFailureSaldoNoDisponible()
	{
		expectedEx.expect(HandledException.class);
		expectedEx.expectMessage("El saldo de la cuenta es menor al importe");
		
		Cliente cliente = new Cliente(1);
		Cliente cliente2 = new Cliente(2);
		

		Cuenta cuenta = new Cuenta(Moneda.Pesos,1,TipoCuenta.CajaAhorro);	
		cuenta.setID(1234);
		Cuenta cuentaDestino = new Cuenta(Moneda.Pesos,123,TipoCuenta.CajaAhorro);	
		cuentaDestino.setID(1);
		cliente.AgregarCuenta(cuenta);
		cliente2.AgregarCuenta(cuentaDestino);

		cliente.getCuentas().get(0).Depositar(100);
		cliente.getCuentas().get(0).Depositar(200);

		cliente.getCuentas().get(0).TransferirDinero(cuentaDestino, 10000);
		
		assertEquals(300, cliente.getCuentas().get(0).getSaldo(),0);
		assertEquals(100, cliente2.getCuentas().get(0).getSaldo(),0);
	}
	
	@Test
	public void TransferirDineroCuentaTestFailureCuentaDestinoInhabilitada()
	{
		expectedEx.expect(HandledException.class);
		expectedEx.expectMessage("La cuenta no esta activa");
		
		Cliente cliente = new Cliente(1);
		Cliente cliente2 = new Cliente(2);
		
		Cuenta cuenta = new Cuenta(Moneda.Pesos,1,TipoCuenta.CajaAhorro);	
		cuenta.setID(1);
		Cuenta cuentaDestino = new Cuenta(Moneda.Pesos,2,TipoCuenta.CajaAhorro);	
		cuentaDestino.setID(2);
		cliente.AgregarCuenta(cuenta);
		cliente2.AgregarCuenta(cuentaDestino);
		
		cuentaDestino.Desactivar();

		cliente.getCuentas().get(0).Depositar(100);
		cliente.getCuentas().get(0).Depositar(100);
		cliente.getCuentas().get(0).TransferirDinero(cuentaDestino, 100);
		
		assertEquals(300, cliente.getCuentas().get(0).getSaldo(),0);
		assertEquals(100, cliente2.getCuentas().get(0).getSaldo(),0);
	}
}
